package dq.study.datasource;

/**
 * @author dongqun
 * @version 1.0
 * @description 装饰和继承的区别：
 *  装饰模式比继承要灵活。避免了继承体系臃肿。
 * 而且降低了类于类之间的关系。
 * 装饰类因为增强已有对象，具备的功能和已有的是相同的，只不过提供了更强功能。
 * 所以装饰类和被装饰类通常是都属于一个体系中的。
 * @date 2019/9/23 13:48
 */
public class 狗 implements 动物{

    public void 吃(){
        System.out.println("狗在烘烘烘烘的吃");
    }

    public void 叫(){
        System.out.println("狗在汪汪汪汪的叫");
    }

    public void 狗的方法1(){

    }

    public void 狗的方法2(){

    }

    public void 狗的方法3(){

    }

    public void 狗的方法4(){

    }


    public static void main(String[] args){
        继承狗 extendDog = new 继承狗();
        extendDog.叫();
        extendDog.吃();
        狗 dog = new 狗();
        装饰狗 docorateDog = new 装饰狗(dog);
        docorateDog.叫();
        docorateDog.吃();
    }
}

interface 动物{
    void 吃();
    void 叫();
}


class 继承狗 extends 狗{
    @Override
    public void 叫() {
        System.out.println("继承狗在漾漾漾漾的叫");
    }
}

/**
 装饰设计模式：
 当想要对已有的对象进行功能增强时，
 可以定义类，将已有对象传入，基于已有的功能，并提供加强功能。
 那么自定义的该类称为装饰类
 */
class 装饰狗 implements 动物{

    private 动物 animal;

    public 装饰狗(动物 animal) {
        this.animal = animal;
    }

    @Override
    public void 吃() {
        animal.吃();
    }

    @Override
    public void 叫() {
        System.out.println("装饰狗在哇哇哇哇的叫");
    }
}




